#include <vector>
#include <queue>
#include "sched_rr.h"
#include "basesched.h"

using namespace std;

SchedRR::SchedRR(vector<int> argn) {
	// Round robin recibe el quantum por parámetro
	def_quantum = argn[0];
	quantum = 0;
}

void SchedRR::load(int pid) {
	cola.push(pid); // llegó una tarea nueva
}

void SchedRR::unblock(int pid) {
	cola.push(pid); // Se re-encola la tarea
}

int SchedRR::tick(const enum Motivo m) {
	if (m == BLOCK || m == EXIT) {
		// El proceso actual no se re-encola
		return siguiente();
	} else { // m == TICK
		if (quantum) {
			// caso no-switch
			quantum--;
			return current_pid();
		} else {
			// Caso switch, re-encolo el proceso actual
			if (current_pid() != IDLE_TASK) {
				cola.push(current_pid());
			}
			return siguiente();
		}
	}
}

int SchedRR::siguiente() {
	// Elijo el nuevo pid
	int nuevo = IDLE_TASK;
	quantum = 0; // El IDLE_TASK tiene un quantum nulo, así al próximo tick verifica otra vez si hay alguien esperando.
	if (!cola.empty()) {
		nuevo = cola.front();
		cola.pop();
		quantum = def_quantum - 1;
	}
	return nuevo;
}
